from typing import List
from common.enum.strategy_group_enum import StrategyGroup
from common.enum.strategy_type_enum import StrategyType
from dto.strategy_info import StrategyInfoMetadata
from dto.strategy_assessment import RiskAssessment
from dto.strategy_stock_day import StrategyStockDay
from service.strategy.base_strategy import BaseStrategy


class TenDaysOverallUptrendStrategy(BaseStrategy):
    """
    关注策略：分析某个股票在过去10个交易日是否呈整体连续上涨趋势。
    条件：
    - 至少7天为上涨日。
    - 每上涨1天得1分，涨幅大于3%额外加1分。
    - 每下跌1天扣1分，跌幅超过2%额外扣1分。
    """

    def analyze(self, trade_info_list: List[StrategyStockDay]) -> RiskAssessment:
        """
        分析股票的前10个交易日是否呈整体连续上涨趋势。
        """
        node_point = 0
        description = ""

        # 确保至少有10天的交易数据
        if len(trade_info_list) >= 10:
            # 获取前10个交易日数据
            last_ten_days = trade_info_list[-10:]
            up_days = 0
            down_days = 0

            # 遍历每一天的交易数据并计算分数
            for i in range(1, len(last_ten_days)):
                prev_day = last_ten_days[i - 1]
                curr_day = last_ten_days[i]
                daily_change = (curr_day.close - prev_day.close) / prev_day.close

                if daily_change > 0:  # 上涨
                    up_days += 1
                    node_point += 1  # 每上涨一天加1分
                    if daily_change > 0.03:  # 涨幅大于3%
                        node_point += 1
                    description += f"第{i}天：上涨{daily_change:.2%}，加{1 + (1 if daily_change > 0.03 else 0)}分；"
                elif daily_change < 0:  # 下跌
                    down_days += 1
                    node_point -= 1  # 每下跌一天扣1分
                    if abs(daily_change) > 0.02:  # 跌幅大于2%
                        node_point -= 1
                    description += f"第{i}天：下跌{daily_change:.2%}，扣{1 + (1 if abs(daily_change) > 0.02 else 0)}分；"

            # 检查整体条件
            if up_days >= 7:
                description += (
                    f"过去10天内有{up_days}天上涨（满足条件），{down_days}天下跌。"
                )
            else:
                node_point = 0  # 如果不满足至少7天上涨，则清空得分
                description += f"过去10天内仅有{up_days}天上涨（未满足条件）。"

        else:
            description = "交易数据不足10天，无法评估。"

        return RiskAssessment(
            stock_code=trade_info_list[0].stock_code,
            description=description,
            config=self.strategyConfig(),
            node_point=node_point,
        )

    def strategyConfig(self) -> StrategyInfoMetadata:
        """
        返回策略的配置
        """
        return StrategyInfoMetadata(
            strategy_code="ten_days_overall_uptrend",
            strategy_name="十日整体连续上涨趋势",
            strategy_group=StrategyGroup.ATTENTION,  # 关注型策略
            strategy_type=StrategyType.PRICE,  # 根据价格类型
            analysis_day=10,
            strategy_level=3,
        )
